// ==UserScript==
// @name         华医网系列脚本-找课件
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  模拟鼠标移动点击，检测视频播放状态，30秒循环检测按钮
// @author       You
// @match        https://cme28.91huayi.com/pages/course.aspx?cid=*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';
    let loopInterval = null; // 循环定时器ID

    // 1. 获取元素中心点坐标（考虑页面滚动）
    function getElementCenter(element) {
        const rect = element.getBoundingClientRect();
        return {
            x: rect.left + rect.width / 2 + window.scrollX,
            y: rect.top + rect.height / 2 + window.scrollY
        };
    }

    // 2. 模拟鼠标移动到指定坐标
    function simulateMouseMove(x, y) {
        const moveEvent = new MouseEvent('mousemove', {
            clientX: x - window.scrollX,
            clientY: y - window.scrollY,
            screenX: x,
            screenY: y,
            bubbles: true,
            cancelable: true,
            view: window
        });
        document.dispatchEvent(moveEvent);
        console.log(`[鼠标移动] 坐标: (${x}, ${y})`);
    }

    // 3. 模拟鼠标移动到元素后点击（含自然停顿）
    function moveAndClick(element) {
        if (!element) return false;

        const { x, y } = getElementCenter(element);
        simulateMouseMove(x, y); // 移动到元素

        // 移动后停顿100ms，模拟人手定位
        setTimeout(() => {
            // 按下鼠标
            element.dispatchEvent(new MouseEvent('mousedown', {
                clientX: x - window.scrollX,
                clientY: y - window.scrollY,
                bubbles: true,
                cancelable: true
            }));
            console.log(`[点击操作] 按下元素: ${element.tagName}`);

            // 按压停顿150ms，模拟真实点击力度
            setTimeout(() => {
                // 松开鼠标
                element.dispatchEvent(new MouseEvent('mouseup', {
                    clientX: x - window.scrollX,
                    clientY: y - window.scrollY,
                    bubbles: true,
                    cancelable: true
                }));
                console.log(`[点击操作] 松开元素: ${element.tagName}`);

                // 触发点击完成
                element.dispatchEvent(new MouseEvent('click', {
                    clientX: x - window.scrollX,
                    clientY: y - window.scrollY,
                    bubbles: true,
                    cancelable: true
                }));
                console.log(`[点击操作] 完成点击: ${element.tagName}`);
            }, 150);
        }, 100);

        return true;
    }

    // 4. 检测并点击"播放至"/"未学习"对应的视频链接
    function handleVideoElements() {
        console.log('\n===== 处理视频元素 =====');
        let targetElement = null;

        // 优先查找"播放至"元素
        const playProcessEl = Array.from(document.querySelectorAll('[data-cwrid]')).find(el => 
            el.textContent.trim().includes('播放至')
        );
        if (playProcessEl) {
            targetElement = playProcessEl;
            console.log('[视频检测] 找到"播放至"元素');
        } else {
            // 查找"未学习"元素
            const unlearnedEl = Array.from(document.querySelectorAll('[data-cwrid]')).find(el => 
                el.textContent.trim().includes('未学习')
            );
            if (unlearnedEl) {
                targetElement = unlearnedEl;
                console.log('[视频检测] 找到"未学习"元素');
            }
        }

        // 点击对应视频链接
        if (targetElement) {
            const cwrid = targetElement.getAttribute('data-cwrid');
            const videoLink = document.querySelector(`a[href*="cwid=${cwrid}"]`);
            if (videoLink) {
                console.log(`[视频链接] 找到ID:${cwrid}的视频，准备点击`);
                moveAndClick(videoLink);
            } else {
                console.log('[视频链接] 未找到对应视频链接');
            }
        } else {
            console.log('[视频检测] 未找到目标元素');
        }
    }

    // 5. 检测视频是否处于播放状态
    function isVideoPlaying() {
        // 检测<video>标签播放状态
        const video = document.querySelector('video');
        if (video) {
            const playing = !video.paused && !video.ended && video.currentTime > 0;
            console.log(`[视频状态] <video>标签${playing ? '正在播放' : '未播放'}`);
            return playing;
        }

        // 检测播放状态文本（适配自定义播放器）
        const playStatusTexts = ['播放中', '正在播放', '继续播放'];
        const statusEl = document.querySelector(
            playStatusTexts.map(text => `*:contains("${text}")`).join(',')
        );
        if (statusEl) {
            console.log('[视频状态] 检测到播放状态文本');
            return true;
        }

        console.log('[视频状态] 未检测到播放状态');
        return false;
    }

    // 6. 循环检测"知道了"系列按钮
    function checkConfirmButtons() {
        console.log('\n===== 开始按钮检测循环 =====');
        // 检测3种按钮（可根据实际HTML调整选择器）
        const buttons = [
            document.querySelector('input[value="知道了"].rig_btn'),
            document.querySelector('input[value="知道了2"].rig_btn'), // 假设按钮2的value是"知道了2"
            document.querySelector('input[value="知道了3"].rig_btn')  // 假设按钮3的value是"知道了3"
        ];

        // 遍历按钮并点击
        buttons.forEach((btn, index) => {
            if (btn) {
                console.log(`[按钮检测] 找到"知道了${index + 1}"按钮，准备点击`);
                moveAndClick(btn);
            } else {
                console.log(`[按钮检测] 未找到"知道了${index + 1}"按钮`);
            }
        });
        console.log('===== 本轮按钮检测结束 =====\n');
    }

    // 7. 主逻辑控制
    function mainLogic() {
        // 首次处理视频元素
        handleVideoElements();

        // 延迟3秒检测视频状态（等待页面响应）
        setTimeout(() => {
            if (isVideoPlaying()) {
                console.log('[主逻辑] 视频正在播放，启动30秒按钮检测循环');
                // 立即执行一次按钮检测
                checkConfirmButtons();
                // 设置30秒循环检测按钮
                loopInterval = setInterval(checkConfirmButtons, 30000);
            } else {
                console.log('[主逻辑] 视频未播放，刷新页面重新执行');
                // 清除可能存在的定时器
                if (loopInterval) clearInterval(loopInterval);
                // 刷新页面
                window.location.reload();
            }
        }, 3000);
    }

    // 页面加载完成后启动
    window.addEventListener('load', () => {
        console.log('[启动] 页面加载完成，开始执行脚本');
        mainLogic();
    });
})();